package com.zhq.share;

import com.zhq.test.Person;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @Author:钟豪强
 * @Description:
 * @Date Created in  2020-08-15 15:18
 * @Modified By:
 */
public class ReflectDemo {

    public static void main(String[] args) throws Exception {
        //1. 获取成员变量
        //    - `getFields()`
        //    - `getField(String name)`
        //    - `getDeclaredFields()`
        //    - `getDeclaredField(String name)`
        // 2. 获取构造方法
        //    - `getConstructors()`
        //    - `getConstructor(类<?>... parameterTypes)`
        //    - `getDeclaredConstructors()`
        //    - `getDeclaredField(String name)`
        // 3. 获取成员方法
        //    - `getMethods()`
        //    - `getMethod(String name, 类<?>... parameterTypes)`
        //    - `getDeclaredMethods()`
        //    - `getDeclaredMethod(String name, 类<?>... parameterTypes)`
        // 4. 获取类名
        //    - `getName()`        获取类名
        //    - `getPackageName()`        获取包名

        //获取Person的s对象
         Class personClass = Person.class;
        // //获取public修饰的成员变量
        // Field[] fields = personClass.getFields();
        // for (Field field:fields) {
        //     System.out.println(field);
        // }
        //
        // //获取所有成员变量getDeclaredFields()
        // Field[] declaredFields = personClass.getDeclaredFields();
        // for (Field declaredField:declaredFields) {
        //     System.out.println(declaredField);
        // }
        //
        // //获取成员变量name的值
        // Field id = personClass.getField("id");
        // Person p = new Person();
        // Object value = id.get(p);
        // System.out.println(value); //预计是0
        // //设置成员变量id的值
        // id.set(p,123456);
        // System.out.println(p);
        //
        //
        // Field name = personClass.getDeclaredField("name");
        // //忽略访问权限修饰符的安全检查
        // name.setAccessible(true);//暴力反射
        // Object value1 = name.get(p);
        // System.out.println(value1);
        // name.set(p,"张三");
        // System.out.println(p);


        //2. 获取构造方法
        //    - `getConstructors()`
        //    - `getConstructor(类<?>... parameterTypes)`
        //    - `getDeclaredConstructors()`
        //    - `getDeclaredField(String name)`

        // Constructor constructor = personClass.getConstructor(String.class, int.class);
        // System.out.println(constructor);
        // //创建对象
        // Object person = constructor.newInstance("张三", 23);
        // System.out.println(person);


        //getMethod(String name, 类<?>... parameterTypes)
        // Method eat = personClass.getMethod("eat");
        // Person p = new Person();
        // //空参方法
        // eat.invoke(p);
        //
        //
        // Method eat_method = personClass.getMethod("eat", String.class);
        // //一参方法
        // eat_method.invoke(p,"苹果");
        //
        // //获取所有public修饰的方法
        // Method[] methods = personClass.getMethods();
        // for (Method method:methods) {
        //     System.out.println(method);
        //}
        int[] number = {2, 3, 1, 0, 2, 5, 3};
        int numbers = findRepeatNumber(number);
        System.out.println(numbers);
    }

    public static int findRepeatNumber(int[] nums) {
        // Map<Integer, Integer> map = new HashMap<>();
        // for(int i = 0; i < nums.length; i++) {
        //     Integer result = map.put(nums[i],i);
        //     System.out.println(nums[i]);
        //     System.out.println(i);
        //     System.out.println(result);
        //     if (result != null) {
        //         return nums[i];
        //     }
        // }
        // return 0;
        if(nums==null || nums.length==0) {
            return -1;
        }
        for(int i = 0 ; i < nums.length;i++){
            //如果该数字没有和他的索引相等
            while(nums[i]!=i){
                System.out.println(nums[i]);
                //重复返回
                if(nums[i]==nums[nums[i]]){
                    System.out.println(nums[i]);
                    return nums[i];
                }
                //不重复交换
                int temp = nums[nums[i]];
                System.out.println(temp);
                nums[nums[i]] = nums[i];
                System.out.println(nums[nums[i]]);
                nums[i] = temp;
                System.out.println(nums[i]);
            }
        }
        return -1;
    }

}
